新しい Android プラグイン API のサポート
Android Flutter プラグインを作成または保守していない場合は、 このページはスキップできます。
1.12 リリース以降、
新しいプラグイン API が Android プラットフォームで利用可能になりました。
古い API は以下に基づいていますPluginRegistry.Registrar
すぐに廃止されるわけではありませんが、
ただし、以下に基づいて新しい API に移行することをお勧めします。FlutterPlugin
。
新しい API には、よりクリーンなセットを提供するという利点があります。
ライフサイクル依存コンポーネントのアクセサーの比較
古い API に。例えばPluginRegistry.Registrar.activity()
次の場合は null を返す可能性があります
Flutter はどのアクティビティにも関連付けられていません。
言い換えれば、古い API を使用するプラグインは未定義のデータを生成する可能性があります。 Flutter を Android アプリに埋め込むときの動作。 ほとんど flutterプラグインflutter.dev によって提供されます チームはすでに移行されています。 (なる方法を学ぶ検証済みの発行者pub.dev にあります!) 例としては、 新しい API を使用するプラグインについては、を参照してください。バッテリープラスパッケージ。
アップグレード手順
次の手順は、新しい API をサポートする手順の概要を示しています。
-
メインのプラグイン クラスを更新します (
*Plugin.java
) を実装するには、FlutterPlugin
インターフェース。より複雑なプラグインの場合は、 分離することができますFlutterPlugin
とMethodCallHandler
2つのクラスに分けます。次のセクションを参照してください。基本プラグイン、 アプリのリソースへのアクセスの詳細については、 埋め込みの最新バージョン (v2)。
また、プラグインには静的ファイルが含まれている必要があることに注意してください。registerWith()
アプリとの互換性を維持するための方法 v2 Android 埋め込みは使用しないでください。 (見る1.12 より前の Android プロジェクトのアップグレード詳細については。) (可能であれば) 最も簡単な方法は、ロジックを次の場所から移動することです。registerWith()
両方をプライベートメソッドに変換しますregisterWith()
とonAttachedToEngine()
呼び出すことができます。 またregisterWith()
またonAttachedToEngine()
呼ばれるだろう、 両方ではありません。
さらに、オーバーライドされていないパブリック メンバーをすべて文書化する必要があります。 プラグイン内で。アプリに追加するシナリオでは、 これらのクラスは開発者がアクセスでき、 書類が必要です。 -
(オプション) プラグインが必要な場合は、
Activity
参照、 も実装しますActivityAware
インターフェース。 -
(オプション) プラグインが次の場所に保持されることが予想される場合 バックグラウンド サービスをいつでも実装できます。
ServiceAware
インターフェース。 -
サンプルアプリの更新
MainActivity.java
を使用する v2 埋め込みFlutterActivity
。詳細については、を参照してください。1.12 より前の Android プロジェクトのアップグレード。 プラグイン クラスのパブリック コンストラクターを作成する必要がある場合があります。 まだ存在していない場合。例えば:MainActivity.javapackage io.flutter.plugins.firebasecoreexample; import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.plugins.firebase.core.FirebaseCorePlugin; public class MainActivity extends FlutterActivity { // You can keep this empty class or remove it. Plugins on the new embedding // now automatically registers plugins. }
-
(オプション) 削除した場合
MainActivity.java
を更新します。<plugin_name>/example/android/app/src/main/AndroidManifest.xml
使用するio.flutter.embedding.android.FlutterActivity
。 例えば:AndroidManifest.xml<activity android:name="io.flutter.embedding.android.FlutterActivity" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale" android:hardwareAccelerated="true" android:exported="true" android:windowSoftInputMode="adjustResize"> <meta-data android:name="io.flutter.app.android.SplashScreenUntilFirstFrame" android:value="true" /> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
-
(オプション)
EmbeddingV1Activity.java
ファイル サンプル プロジェクトに v1 埋め込みを使用する と同じフォルダ内MainActivity
に v1 埋め込みの互換性をテストし続ける プラグインと一緒に。手動で行う必要があることに注意してください を使用する代わりにすべてのプラグインを登録しますGeneratedPluginRegistrant
。例えば:EmbeddingV1Activity.javapackage io.flutter.plugins.batteryexample; import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.battery.BatteryPlugin; public class EmbeddingV1Activity extends FlutterActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); BatteryPlugin.registerWith(registrarFor("io.flutter.plugins.battery.BatteryPlugin")); } }
-
追加
<meta-data android:name="flutterEmbedding" android:value="2"/>
に<plugin_name>/example/android/app/src/main/AndroidManifest.xml
。 これにより、サンプル アプリが v2 埋め込みを使用するように設定されます。 -
(オプション)
EmbeddingV1Activity
前のステップで、EmbeddingV1Activity
に<plugin_name>/example/android/app/src/main/AndroidManifest.xml
ファイル。 例えば:AndroidManifest.xml<activity android:name=".EmbeddingV1Activity" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale" android:hardwareAccelerated="true" android:exported="true" android:windowSoftInputMode="adjustResize"> </activity>
プラグインをテストする
残りの手順ではプラグインのテストに取り組みます。これをお勧めします。 しかし必須ではありません。
-
アップデート
<plugin_name>/example/android/app/build.gradle
への参照を置き換えるandroid.support.test
とandroidx.test
:build.gradledefaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ... }
build.gradledependencies { ... androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test:rules:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' ... }
-
テストファイルを追加
MainActivity
とEmbeddingV1Activity
の<plugin_name>/example/android/app/src/androidTest/java/<plugin_path>/
。 これらのディレクトリを作成する必要があります。例えば:MainActivityTest.javapackage io.flutter.plugins.firebase.core; import androidx.test.rule.ActivityTestRule; import io.flutter.plugins.firebasecoreexample.MainActivity; import org.junit.Rule; import org.junit.runner.RunWith; @RunWith(FlutterRunner.class) public class MainActivityTest { // Replace `MainActivity` with `io.flutter.embedding.android.FlutterActivity` if you removed `MainActivity`. @Rule public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class); }
EmbeddingV1ActivityTest.javapackage io.flutter.plugins.firebase.core; import androidx.test.rule.ActivityTestRule; import io.flutter.plugins.firebasecoreexample.EmbeddingV1Activity; import org.junit.Rule; import org.junit.runner.RunWith; @RunWith(FlutterRunner.class) public class EmbeddingV1ActivityTest { @Rule public ActivityTestRule<EmbeddingV1Activity> rule = new ActivityTestRule<>(EmbeddingV1Activity.class); }
-
追加
integration_test
とflutter_driver
dev_dependency から<plugin_name>/pubspec.yaml
と<plugin_name>/example/pubspec.yaml
。pubspec.yamlintegration_test: sdk: flutter flutter_driver: sdk: flutter
-
環境の最小 Flutter バージョンを更新します
<plugin_name>/pubspec.yaml
。すべてのプラグインが移動中 forward は最小バージョンを 1.12.13+hotfix.6 に設定します。 これは、サポートを保証できる最小バージョンです。 例えば:pubspec.yamlenvironment: sdk: ">=2.16.1 <3.0.0" flutter: ">=1.17.0"
-
で簡単なテストを作成します
<plugin_name>/test/<plugin_name>_test.dart
。 v2 埋め込みサポートを追加する PR をテストする目的で、 私たちはプラグインの非常に基本的な機能をテストしようとしています。 これはプラグインが適切に登録されていることを確認するためのスモーク テストです。 新しいエンベダーを使用して。例えば:import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); testWidgets('Can get battery level', (tester) async { final Battery battery = Battery(); final int batteryLevel = await battery.batteryLevel; expect(batteryLevel, isNotNull); }); }
-
テスト実行してください
integration_test
ローカルでテストします。端末では、 以下をせよ:flutter test integration_test/app_test.dart
基本プラグイン
コードで Flutter Android プラグインを使い始めるには、
実装することから始めるFlutterPlugin
。
public class MyPlugin implements FlutterPlugin {
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
// TODO: your plugin is now attached to a Flutter experience.
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
// TODO: your plugin is no longer attached to a Flutter experience.
}
}
上に示したように、プラグインは次のような場合があります (またはそうでない場合があります)。
での特定の Flutter エクスペリエンスに関連付けられる
あらゆる瞬間。
プラグインの動作を初期化するように注意する必要があります
のonAttachedToEngine()
、プラグインをクリーンアップします
の参照onDetachedFromEngine()
。
FlutterPluginBinding は、プラグインにいくつかの機能を提供します。 重要な参考文献:
- binding.getFlutterEngine()
- を返します
FlutterEngine
プラグインがアタッチされているもの、 のようなコンポーネントへのアクセスを提供するDartExecutor
、FlutterRenderer
、 もっと。 - binding.getApplicationContext()
- Android アプリケーションの
Context
実行中のアプリの場合。
UI/アクティビティプラグイン
プラグインが UI と対話する必要がある場合は、
権限のリクエストや Android UI クロムの変更など、
その場合は、プラグインを定義するために追加の手順を実行する必要があります。
実装する必要がありますActivityAware
インターフェース。
public class MyPlugin implements FlutterPlugin, ActivityAware {
//...normal plugin behavior is hidden...
@Override
public void onAttachedToActivity(ActivityPluginBinding activityPluginBinding) {
// TODO: your plugin is now attached to an Activity
}
@Override
public void onDetachedFromActivityForConfigChanges() {
// TODO: the Activity your plugin was attached to was
// destroyed to change configuration.
// This call will be followed by onReattachedToActivityForConfigChanges().
}
@Override
public void onReattachedToActivityForConfigChanges(ActivityPluginBinding activityPluginBinding) {
// TODO: your plugin is now attached to a new Activity
// after a configuration change.
}
@Override
public void onDetachedFromActivity() {
// TODO: your plugin is no longer associated with an Activity.
// Clean up references.
}
}
と対話するにはActivity
、 あなたのActivityAware
プラグインは必須です
4つの段階で適切な行動を実装します。まず、プラグイン
に取り付けられていますActivity
。それにアクセスできますActivity
と
提供されたコールバックの数ActivityPluginBinding
。
以来Activity
構成変更中に破棄される可能性があります。
指定されたへの参照をクリーンアップする必要がありますActivity
のonDetachedFromActivityForConfigChanges()
、
そしてそれらの参照を再確立しますonReattachedToActivityForConfigChanges()
。
最後に、onDetachedFromActivity()
プラグインはクリーンアップする必要があります
関連するすべての参考資料をアップActivity
動作と戻り
非 UI 構成。